import request from '@/utils/request';

// 生成目标数组的主函数
const generateTimeArray = async (startTimes, endTimes) => {
  // 获取接口时间戳并转换为毫秒级（*1000）
  const apiTimestamp = await request('wxapp/common/getTimeStamp');
  const currentTime = new Date(apiTimestamp * 1000);
  const result = [];

  // 循环生成30天数据（今天到30天后）
  for (let i = 0; i < 30; i++) {
    // 计算当前循环的日期
    const targetDate = new Date(currentTime);
    targetDate.setDate(currentTime.getDate() + i);

    // 处理日期：几月几号（如10月17日）
    const year = targetDate.getFullYear();
    const month = targetDate.getMonth() + 1;
    const day = targetDate.getDate();
    const dateStr = `${year}年${month}月${day < 10 ? `0${day}` : day}日`;

    // 处理周几：前两天替换为“今天”“明天”，其余显示周X
    let weekStr = '';
    if (i === 0) {
      weekStr = '今天';
    } else if (i === 1) {
      weekStr = '明天';
    } else {
      const weekList = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
      weekStr = weekList[targetDate.getDay()];
    }

    // 处理时间段：按30分钟间隔分割，当天需过滤已过去的时段
    let timeSegments = [];
    const isToday = i === 0;
    // 只有当结束时间在当前时间之后时才生成时间段
    if (isToday) {
      const [endHour, endMin] = endTimes.split(':').map(Number);
      const endTimeToday = new Date(currentTime);
      endTimeToday.setHours(endHour, endMin, 0, 0);
      // 结束时间已过则不生成任何时段
      if (currentTime < endTimeToday) {
        // 传入当前时间用于过滤已过时段
        timeSegments = generateTimeSegments(startTimes, endTimes, currentTime);
      }
    } else {
      // 非当天无需过滤，传入null即可
      timeSegments = generateTimeSegments(startTimes, endTimes, null);
    }

    result.push({
      date: dateStr,
      week: weekStr,
      timeSegments: timeSegments,
    });
  }

  return result;
};

// 辅助函数：按30分钟间隔生成时间段（支持过滤已过去的时段）
const generateTimeSegments = (start, end, currentTime) => {
  const segments = [];
  // 解析开始/结束时间为分钟数（便于计算）
  const [startHour, startMin] = start.split(':').map(Number);
  const [endHour, endMin] = end.split(':').map(Number);
  let currentMin = startHour * 60 + startMin;
  const endTotalMin = endHour * 60 + endMin;

  // 循环生成30分钟间隔的时间段
  while (currentMin < endTotalMin) {
    const nextMin = currentMin + 30;
    // 格式化当前时间（补0，如9:5→09:05）
    const formatTime = (min) => {
      const hour = Math.floor(min / 60);
      const minStr = min % 60;
      return `${hour.toString().padStart(2, '0')}:${minStr
        .toString()
        .padStart(2, '0')}`;
    };

    const segment = `${formatTime(currentMin)}-${formatTime(nextMin)}`;
    // 如果是当天且传入了当前时间，需要判断当前时间+30分钟是否已过去该时段
    if (currentTime) {
      // 计算当前时间+30分钟的时间点
      const currentTimePlus30 = new Date(currentTime);
      currentTimePlus30.setMinutes(currentTime.getMinutes() + 30);

      // 计算当前时段的结束时间
      const segmentEndTime = new Date(currentTime);
      segmentEndTime.setHours(Math.floor(nextMin / 60), nextMin % 60, 0, 0);

      // 只保留当前时间+30分钟仍在时段结束时间之前的时段
      if (currentTimePlus30 <= segmentEndTime) {
        segments.push(segment);
      }
    } else {
      // 非当天直接保留所有时段
      segments.push(segment);
    }

    currentMin = nextMin;
  }

  return segments;
};

export default generateTimeArray;
